package com.goldenKey.common.exception;


import com.goldenKey.common.pojo.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import javax.validation.ConstraintViolationException;
import java.net.BindException;

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {


    @ExceptionHandler(value = {Exception.class})
    @ResponseBody
    public <T> R<T> exceptionHandler(Exception e) {
        // 处理自定义异常
        if (e instanceof AppException) {
            AppException appException = (AppException) e;
            log.error("捕获自定义异常：{}", appException.getMsg(), e);
            return R.error(appException.getCode(), appException.getMsg());
        }

        // 处理参数类型错误
        else if (e instanceof MethodArgumentTypeMismatchException) {
            log.error("捕获参数类型错误：{}", e.getMessage(), e);
            return R.error(300, "参数类型错误");
        }

        // 处理请求参数校验失败
        else if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
            String errorMsg = ex.getBindingResult().getFieldError().getDefaultMessage();
            log.error("请求参数校验失败：{}", errorMsg, e);
            return R.error(100, "请求参数错误：" + errorMsg);
        }

        // 处理请求参数错误
        else if (e instanceof ConstraintViolationException || e instanceof BindException) {
            log.error("请求参数错误：{}", e.getMessage(), e);
            return R.error(100, "请求参数错误");
        }

        // 拦截未知异常
        else {
            log.error("服务器捕获未知异常：{}", e.getMessage(), e);
            return R.error(400, "服务器内部错误，请联系管理员");
        }
    }
}

